#ifndef QQMUSIC_H
#define QQMUSIC_H

#include <QWidget>
#include "volumetool.h"
#include "musiclist.h"
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include "commonpage.h"
#include "lrcpage.h"
#include <QPropertyAnimation>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QMessageBox>   //展示信息
#include <QSystemTrayIcon>

QT_BEGIN_NAMESPACE
namespace Ui { class QQMusic; }
QT_END_NAMESPACE

class QQMusic : public QWidget
{
    Q_OBJECT
public:
    QQMusic(QWidget *parent = nullptr);
    ~QQMusic();

    void initSqlite();
    void initMusicList();

    void initUi();

    void initPlay(); //初始化媒体播放相关

    //程序执行时就把 需要添加到recBox的所有recBoxItem就初始化好
    QJsonArray randomPiction(); //需要有返回值QJsonArray  保存后需要拿出

    void connectSignalAndSlots();

    void updateBtformAnimal();//点击播放哪个btform页面上的歌曲时，动画效果在其页面上面 其他页面的动画隐藏

    void onQQMusicQuit();//托盘中
    void onTrayIconActivated(QSystemTrayIcon::ActivationReason reason);//双击托盘处理方法

protected:
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);


private slots:
    void on_quit_clicked();

    //自定义信号槽函数
    void onBtFormClick(int pageId); //QQMusic收到btForm发射的自定义信号后 需要做的处理方法
    void updateLikeMusicAndPage(bool isLike,const QString& musicId);

    void on_volume_clicked();
    void on_addLocal_clicked();


    //播放控制区的槽函数

    //点击播放按钮 歌曲在播放和暂停之间切换
   // void onPlayMusic();
    void on_play_clicked();

    //上一曲
    void on_playDown_clicked();
    //void onPlayUpClicked();
    //下一曲
    void on_playUp_clicked();
    //void onPlayUpClicked();

    //播放模式设置
    void on_playMode_clicked();

    //void onPlayerStateChanged(); //QMediaPlayer中stateChanged信号对应槽函数 来处理切换播放后 播放暂停图标的切换
    //void onPlaybackModeChanged(QMediaPlaylist::PlaybackMode playbackMode); // 信号对应槽函数 来处理切换播放后 播放暂停图标的切换
    //但是我们也可以直接把图标设置放在on_playMode_clicked里模式切换并设置后直接设置图标，上面两行都是这样做的

    void onPlayAll(PageType pageType);//这个槽函数是处理 接收commonPage发送的信号 对应的处理槽函数
            //因为有参数所以只能手动connect连接
    void playAllMusicOfCommonPage(CommonPage* page,int index);
    void playMusicByIndex(CommonPage* page,int index);

    void onCurrentIndexChanged(int index);//playlist中播放源索引发生了改变 index表示正在播放歌曲的索引


     //设置播放器是否静音
    void setPlayerMuted(bool isMuted);//接收volumetool发送过来的setMusicMuted(bool isMuted)信号 对应的槽函数

    //设置播放器音量
    void setPlayerVolume(int volume);//接收voluetool发送过来的setMusicVolume(int volume)信号  对应的槽函数


    void onDurationChanged(qint64 duration); //媒体源歌曲间切换时(媒体的总时长会改变)触发的信号 的槽函数
    void onPositionChanged(qint64 position); //播放进度发生改变时(播放时长的位置改变)触发的信号  的槽函数

    void onMusicsliderChanged(float ration);//进度条发生改变(进度条的位置改变) 的槽函数  需要播放时间跟着改变

    void onMetaDataAvailableChanged(bool available); //媒体元数据 可用性发生 改变时出发的信号 (加载完成,状态改变,可用不可用转变 参数是该 媒体元数据(歌曲名字,作者名字等)是否可用
                                    //这的参数好像可以不要

    void on_lrcWord_clicked();
    //void onLrcWordClicked();

    void on_skin_clicked();

    void on_max_clicked();

    void on_min_clicked();

private:
    Ui::QQMusic *ui;

    QPoint dragPosition; //窗口移动后 的距离

    VolumeTool* volumeTool;//调节音量对象

    MusicList musicList;

    QMediaPlayer* player; //一个 音乐播放 类
    QMediaPlaylist* playList;//专门用来管理播放源，包含一些播放设置

    CommonPage* currentPage;// 当前正在播放的CommonPage页面
    int currentIndex;      // 记录当前正在播放歌曲在媒体列表中的索引`
    qint64 totalTime;      // 记录媒体源的总时间`

    LrcPage* lrcPage;

    QPropertyAnimation* lrcPageAnimal; //动画对象

    QSqlDatabase sqlite;

    bool isDrag;


};
#endif // QQMUSIC_H
